package com.flong.scala.base

import Array._

/**
 * Created by liangjl
 * Date on 2016/6/30-10:05
 * Version:1.0
 * Description:Scala的处理数值的案例
 *
 * 可以不用main方法，继承App即可运行，但是如果抽取一个单独的方法的时候，必须在外面
 * 运行时要重新调用，才会继续这类里面的所有方法体。
 *
 */
object Test3 extends App {

  //执行。
  //LinkedHashSet()
  //list1()
  //list2()
  list3()


  /** *
   * LinkedHashSet的处理
   */
  private def LinkedHashSet(): Unit = {
    //创建一个LinkedHashSet集合
    val set = new scala.collection.mutable.LinkedHashSet[Any]
    set += "This is a string" // 添加一个字符串
    set += 732 // 添加一个数值
    set += 'c' // 添加一个字符
    set += true // 添加一个boolean值
    set += main _ // 添加一个 main函数，这个是继承App里面的，也可以不用就继承App在本类创建一个main即可

    //创建一个迭代器对象(类型为Any)代表接收任何类型.
    //可以省略（: Iterator[Any]）
    val iter: Iterator[Any] = set.iterator
    //判断是否有下一个值就获取处理
    while (iter.hasNext) {
      println(iter.next.toString())
    }
  }


  /**
   * List的数值处理
   */
  def list1(): Unit = {
    //1)要使用的程序的数组，必须声明一个变量来引用数组，必须指定数组变量可以引用的类型。下面是语法声明数组变量

    //2)定义一个list1数组,并且给三个元素大小
    val list1: Array[String] = new Array[String](3)

    //3)这种写法可以不用写上类型数组。Scala会自己会知道他是什么类型
    //我们在学习TypeScript也讲过，参考博客请看.http://blog.csdn.net/jilongliang/article/details/46998877
    //var list1 =new Array[String](3)//

    //4)这种写法更简便，但是必须要去掉一个New关键字

    val list2 = Array("1", "2", "3") //

    //添加元素
    list1(0) = "第一个"
    list1(1) = "第二个"
    list1(2) = "第三个"

    //循环输出
    for (str <- list1) {
      println(str)
    }

    //循环输出
    for (str <- list2) {
      println(str)
    }

  }


  /**
   * rang的使用，需要导入import  Array._
   * 这使得使用range() 方法来产生包含在给定的范围内增加整数序列的数组。
   * 可以使用最后一个参数创建序列 如果不使用最后一个参数，然后一步将被假定为1
   *
   */
  def list2(): Unit = {

    //这行代码的是说，12-20这个范围内，每输出一个数字就12的基础一直累加2，直到20之前的数值为止
    val mylist1 = range(12, 20, 2)

    for (x <- mylist1) {
      println(x)
    }
    println("_______________________________________")

    val myList2 = range(10, 20) //这行代码的意思就说输出10-20之内的数字，不包括20

    for (x <- myList2) {
      println(x)
    }
  }


  /** *
   * 联接数组：
   * 以下是使用concat()方法来连接两个数组的例子。可以通过多个阵列作为参数传递给concat()方法
   */
  def list3(): Unit = {
    val list1 = Array(10.4, 20, 30.5, 50.4)
    val list2 = Array(0.4, 2, 3.5, 5.4)

    val list3 = concat(list1, list2)

    for (x <- list3) {
      println(x)
    }
  }


  /** *
   * 多维数组：
   * 有很多情况下，需要定义和使用多维数组（即数组的元素数组）。例如，矩阵和表格结构的实例可以实现为二维数组。
   * Scala不直接支持多维数组，并提供各种方法来处理任何尺寸数组。以下是定义的二维数组的实例
   */
  def list4(): Unit = {
    var myMatrix = ofDim[Int](3, 3)

    // build a matrix
    for (i <- 0 to 2) {
      for (j <- 0 to 2) {
        myMatrix(i)(j) = j
      }
    }

    // Print two dimensional array
    for (i <- 0 to 2) {
      for (j <- 0 to 2) {
        print(" " + myMatrix(i)(j))
      }
      println()
    }

  }


}
